package com.example.graduationdesign.utils;


import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.RandomUtil;

import com.example.graduationdesign.constant.Constant;
import com.example.graduationdesign.exception.CustomizeException;
import com.example.graduationdesign.pojo.vo.ResultCode;
import org.springframework.util.DigestUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;

/**
 * 共用工具
 */
public class CommonUtil {

    /**
     * 生成指定时间格式的字符串
     *
     * @param timeFormat 指定的时间格式
     * @return 指定时间格式的字符串
     */
    public static String GenerateSpecifiedTimeFormat(String timeFormat) {
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern(timeFormat);
        return LocalDateTime.now().format(formatter);
    }

    /**
     * 生成纯数字验证码
     *
     * @param num 验证码位数  4 - 8
     * @return 验证码
     */
    public static String generateVerificationCode(int num) {
        if (num < 4) {
            num = 4;
        }

        if (num > 8) {
            num = 8;
        }
        return RandomUtil.randomNumbers(num);
    }

    /**
     * 生成 token
     *
     * @param account  账号
     * @param username 用户名称
     * @return token 32 * 3 = 96 位字符串
     */
    public static String generateToken(Long account, String username) {
        // 获取当前时间戳
        long timestamp = System.currentTimeMillis();

        return DigestUtils.md5DigestAsHex(String.valueOf(account).getBytes())
                + DigestUtils.md5DigestAsHex(username.getBytes())
                + DigestUtils.md5DigestAsHex(Long.toString(timestamp).getBytes());
    }

    /**
     * 获取当前请求的用户token
     *
     * @return
     */
    public static String getCurrentUserToken() {
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
                .getRequest();
        return request.getHeader("token");
    }

    /**
     * 单文件上传
     *
     * @param multipartFile 文件列表
     * @return 上传成功后文件名
     */
    public static String uploadFile(MultipartFile multipartFile) {
        // 1. 获取文件原文件名
        String originalFilename = multipartFile.getOriginalFilename();

        // 2. 获取文件后缀
        String suffix = originalFilename.substring(originalFilename.lastIndexOf("."));

        // 3. 生成新文件名
        String newFileName = UUID.randomUUID() + suffix;

        // 4. 将文件上传到指定文件
        try {
            multipartFile.transferTo(new File(Constant.FILE_STORAGE_ADDRESS + newFileName));
            // 5. 返回上传成功之后的文件名
            return newFileName;
        } catch (IOException e) {
            throw new CustomizeException(ResultCode.FILE_UPLOAD_FAIL);
        }
    }

    /**
     * 生成指定数量的各不相同的随机数列表
     *
     * @param max 随机数最大值
     * @param num 随机获取的数目
     * @return 指定数量的题库编码
     */
    public static List<Integer> gainSpecifiedQuantityRandom(Integer max, Integer num) {
        if (num <= 0) {
            return new ArrayList<>();
        }

        Random random = new Random();
        Set<Integer> randSet = new HashSet<>();

        while (true) {
            // random.nextInt(max) 随机产生 [0, max)中的一个随机数
            randSet.add(random.nextInt(max));
            if (randSet.size() == num) {
                return new ArrayList<>(randSet);
            }
        }
    }

}
